package com.android.launcher3.manager;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.NonNull;
import android.text.TextUtils;

import com.android.launcher3.widget.AddWidgetPopWindow;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public enum WidgetManager {
    INSTANCE;

    private static final String WIDGET_MANAGER_KEY = "WidgetManager";
    private static final String SP_KEY = "SP_KEY";

    private final List<WidgetStoreData> widgetStoreDataList = new ArrayList<>();
    private SharedPreferences sharedPref;

    public void init(Context context) {
        sharedPref = context.getSharedPreferences(SP_KEY, Context.MODE_PRIVATE);
        loadList();
    }

    private void loadList() {
        widgetStoreDataList.clear();

        try {
            String value = sharedPref.getString(WIDGET_MANAGER_KEY, "[]");
            JSONArray jsonArray = new JSONArray(value);

            if (jsonArray.length() > 0) {
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    WidgetStoreData widgetStoreData = new WidgetStoreData(jsonObject.optInt("recommendId"));
                    widgetStoreData.widgetId1 = jsonObject.optInt("widgetId1");
                    widgetStoreData.widgetId2 = jsonObject.optInt("widgetId2");
                    widgetStoreData.spiltApp1Package = jsonObject.optString("spiltApp1Package");
                    widgetStoreData.spiltApp2Package = jsonObject.optString("spiltApp2Package");
                    widgetStoreData.spiltApp3Package = jsonObject.optString("spiltApp3Package");
                    widgetStoreData.spiltApp4Package = jsonObject.optString("spiltApp4Package");
                    widgetStoreDataList.add(widgetStoreData);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void save(WidgetStoreData widgetStoreData) {
        if (widgetStoreData.recommendId < 0) return;

        String value = "[]";
        WidgetStoreData findHotSeatEntity = findWidgetStoreEntity(widgetStoreData, widgetStoreDataList);

        if (findHotSeatEntity != null) {
            if (widgetStoreData.widgetId1 > 0) {
                findHotSeatEntity.widgetId1 = widgetStoreData.widgetId1;
            }
            if (widgetStoreData.widgetId2 > 0) {
                findHotSeatEntity.widgetId2 = widgetStoreData.widgetId2;
            }

            if (!TextUtils.isEmpty(widgetStoreData.spiltApp1Package)) {
                findHotSeatEntity.spiltApp1Package = widgetStoreData.spiltApp1Package;
            }

            if (!TextUtils.isEmpty(widgetStoreData.spiltApp2Package)) {
                findHotSeatEntity.spiltApp2Package = widgetStoreData.spiltApp2Package;
            }

            if (!TextUtils.isEmpty(widgetStoreData.spiltApp3Package)) {
                findHotSeatEntity.spiltApp3Package = widgetStoreData.spiltApp3Package;
            }

            if (!TextUtils.isEmpty(widgetStoreData.spiltApp4Package)) {
                findHotSeatEntity.spiltApp4Package = widgetStoreData.spiltApp4Package;
            }

        } else {
            widgetStoreDataList.add(widgetStoreData);
        }

        if (!widgetStoreDataList.isEmpty()) {
            JSONArray jsonArray = getJsonArray(widgetStoreDataList);
            value = jsonArray.toString();
        }

        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString(WIDGET_MANAGER_KEY, value);
        editor.apply();
    }

    private JSONArray getJsonArray(List<WidgetStoreData> list) {
        JSONArray jsonArray = new JSONArray();
        for (int i = 0; i < list.size(); i++) {
            WidgetStoreData widgetStoreData = list.get(i);
            if (widgetStoreData != null) {
                try {
                    JSONObject jsonObject = getJsonObject(widgetStoreData);
                    jsonArray.put(jsonObject);
                } catch (JSONException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return jsonArray;
    }

    private static JSONObject getJsonObject(WidgetStoreData widgetStoreData) throws JSONException {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("recommendId", widgetStoreData.recommendId);
        jsonObject.put("widgetId1", widgetStoreData.widgetId1);
        jsonObject.put("widgetId2", widgetStoreData.widgetId2);
        jsonObject.put("spiltApp1Package", widgetStoreData.spiltApp1Package);
        jsonObject.put("spiltApp2Package", widgetStoreData.spiltApp2Package);
        jsonObject.put("spiltApp3Package", widgetStoreData.spiltApp3Package);
        jsonObject.put("spiltApp4Package", widgetStoreData.spiltApp4Package);
        return jsonObject;
    }

    public WidgetStoreData getWidgetStoreData(int recommendId) {

        if (recommendId <= 0) return null;
        for (int i = 0; i < widgetStoreDataList.size(); i++) {
            WidgetStoreData widgetStoreData = widgetStoreDataList.get(i);
            if (widgetStoreData.recommendId == recommendId) {
                return widgetStoreData;
            }
        }
        return null;
    }

    public static class WidgetStoreData {

        public int recommendId;
        public int widgetId1;
        public int widgetId2;
        public String spiltApp1Package;
        public String spiltApp2Package;
        public String spiltApp3Package;
        public String spiltApp4Package;

        public WidgetStoreData(int recommendId) {
            this.recommendId = recommendId;

        }
    }

    private WidgetStoreData findWidgetStoreEntity(@NonNull WidgetStoreData hotSeatEntity, @NonNull List<WidgetStoreData> data) {
        for (int i = 0; i < data.size(); i++) {

            WidgetStoreData hotSeat = data.get(i);

            if (hotSeat.recommendId == hotSeatEntity.recommendId) {
                return hotSeat;
            }
        }

        return null;

    }

}


